#pragma once

#include <iostream>
#include <cstdarg>
#include <cstdio>
#include <ctime>
#include <string>

// 定义日志等级
#define DEBUG 0
#define NORMAL 1
#define WARNING 2
#define ERROR 3
#define FATAL 4

const char* gLevelMap[] = {
    "DEBUG",
    "NORMAL",
    "WARNING",
    "ERROR",
    "FATAL"
};

#define LOGFILE "./log.txt"  // 定义一个日志的文件

// 日志函数   使用可变参数
void logMessage(int level, const char* format, ...)
{
    // 标准日志部分
    char stdBuffer[1024];
    time_t timestamp = time(nullptr);
    snprintf(stdBuffer, sizeof stdBuffer, "[%d]: [%s]", timestamp, gLevelMap[level]);

    // 自定义部分
    char logBuffer[1024];
    va_list args;  // 定义一个控制可变参数的宏
    va_start(args, format); // 定义起始位置
    vsnprintf(logBuffer, sizeof logBuffer, format, args);  // 把自定义的日志写到字符数组里
    va_end(args);

    // 这里可以把日志写入文件中,也可以打印到显示器中
    // 1.写入文件中
    FILE* fp = fopen(LOGFILE, "a");  // 以a就是追加写的方式打开文件
    fprintf(fp, "%s | %s\n", stdBuffer, logBuffer);
    fclose(fp);

    // 2.写到显示器上
    printf("%s | %s\n", stdBuffer, logBuffer);
}

